package com.aco.party.common.util;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;

import com.aco.party.common.log.LoggerManager;;

/**
 * 打印对象中的值，工具类
 * <P>Title: DebugUtils</P>
 *
 * <P>Description: create by XSDToJava V1.0</P>
 *
 * <P>Copyright: Copyright (c) 2013 </P>
 *
 * <P>Company: xunzuo </P>
 * 
 * @author lijing
 * @version 1.0
 * @create 2013-9-13
 * @history
 */
@SuppressWarnings({ "rawtypes" })
public class DebugUtils {
	private static final Logger logger = LoggerManager.getLogger(DebugUtils.class);

	/**
	 * 打印对象的属性值 日志非常有用
	 * 
	 * @param obj
	 */
	public static void printObj(Object obj) {
		if (logger.isDebugEnabled()) {
			// logger.debug("进入Out类printObj方法！");
			// 如果对象是数组类型
			if (obj.getClass().isArray()) {
				for (int i = 0; i < Array.getLength(obj); i++) {
					printObj(((Object[]) obj)[i]);
				}
			} else {
				// 如果对象是基本类型，则直接打印
				String packName = obj.getClass().getPackage().getName();
				if (packName.equals("java.lang") || packName.equals("java.util")) {
					logger.debug(obj.getClass().getName() + "=" + obj);
					if (obj instanceof List) {
						List list = (List) obj;
						logger.debug("List 大小为=" + list.size());
						for (int i = 0; i < list.size(); i++) {
							Object tmpListObj = list.get(i);
							String tmppackName = tmpListObj.getClass().getPackage().getName();
							// 数组中只能是自定义的pojo对象，否则在业务逻辑类中处理
							if (!(tmppackName.equals("java.lang") || tmppackName.equals("java.util"))) {
								printObj(tmpListObj);
							}
						}
					} else if (obj instanceof Map) {
						Map map = (Map) obj;
						Iterator iter = map.keySet().iterator();
						while (iter.hasNext()) {
							Object tmpkeyObj = iter.next();
							String keypackName = tmpkeyObj.getClass().getPackage().getName();
							Object tmpValueObj = map.get(tmpkeyObj);
							String valuepackName = tmpValueObj.getClass().getPackage().getName();
							// 判断是否key和value中是否致少有一个是pojo
							boolean enter = false;
							if (!(keypackName.equals("java.lang") || keypackName.equals("java.util"))) {
								enter = true;
							}

							if (!(valuepackName.equals("java.lang") || valuepackName.equals("java.util"))) {
								enter = true;
							}
							if (enter && tmpValueObj != null) {
								logger.debug("key值：");
								printObj(tmpkeyObj);
								logger.debug("value值：");
								printObj(tmpValueObj);
							}
						}
					}
				} else {
					try {
						logger.debug("pojo对象[" + obj.getClass().getName() + "]:");
						Class clz = obj.getClass();
						// 对父类也要进行处理
						while (clz.getSuperclass() != null && !clz.getSuperclass().getName().equals("java.lang.Object")) {
							clz = clz.getSuperclass();
							logger.debug("	父pojo对象[" + clz.getName() + "]属性值为：");
							logger.debug("	[");
							Field[] tmpfield = clz.getDeclaredFields();
							for (int i = 0; i < tmpfield.length; i++) {
								tmpfield[i].setAccessible(true);
								Object tmpValueObj = tmpfield[i].get(obj);
								if (tmpValueObj != null) {
									logger.debug("	  " + tmpfield[i].getName() + "=" + tmpfield[i].get(obj));
								}
							}
							logger.debug("	]");
						}
						logger.debug("本类的属性值为：");
						Field[] field = obj.getClass().getDeclaredFields();
						for (int i = 0; i < field.length; i++) {
							field[i].setAccessible(true);
							// 如果值也是对象，则进行递归
							Object valueObj = field[i].get(obj);
							if (valueObj != null) {
								String tmpPackName = valueObj.getClass().getPackage().getName();
								if (!(tmpPackName.equals("java.lang") || tmpPackName.equals("java.util"))) {
									if (field[i].getName() != null && !field[i].getName().equals("NULL")) {
										logger.debug(field[i].getName() + "值为：");
										printObj(valueObj);
									}
								} else {
									// 判断常量土办法，是否全大写
									String oldStr = field[i].getName();
									String upperStr = field[i].getName().toUpperCase();
									if (!oldStr.equals(upperStr)) {
										logger.debug(field[i].getName() + "=" + field[i].get(obj));
									}
								}
							}
						}
						logger.debug("*********[" + obj.getClass().getName() + "]类属性值全部打印完成*******\n");
					} catch (IllegalAccessException ex) {
						ex.printStackTrace();
					} catch (IllegalArgumentException ex) {
						ex.printStackTrace();
					} catch (SecurityException ex) {
						ex.printStackTrace();
					}
				}
			}
		}
		// logger.debug("结束Out类printObj方法！");
	}

	public static void main(String[] args) {
		DebugUtils.printObj(null);
	}
}
